import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * @Author: lmf
 * @Create: 2024/4/13 14:27
 * Description:
 */
public class CreatedCode {
    // 地址前缀
    private final String addrPrefix = "E:/www/gitee/java/personal-record/personal-record-java";
    // 包名
    private final String packageName = "com.mf";
    // 需要生成的表
    private final String tableName = "p_stock_month,p_stock_week";
    // mysql
    private final String mysqlUrl = "123.249.37.201:6002/personal-record";
    private final String mysqlName = "root";
    private final String mysqlPwd = "aA4881351";
    private final List<String> tablePrefix = Arrays.asList("sys_", "t_", "dto_","auth_","p_");
    // 前缀

    // 定义数据库连接URL
    private final String url = "jdbc:mysql://" + this.mysqlUrl + "?characterEncoding=utf8&useSSL=false&serverTimezone" +
            "=GMT" +
            "%2B8" +
            "&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true";

    // 作者
    private final String author = "mf";


    /**
     * 使用FastAutoGenerator自动化生成代码的主函数。
     *
     * @param args 命令行参数（未使用） api
     */
    public static void main(String[] args) {
        final CreatedCode createdCode = new CreatedCode();
        createdCode.createdEntity("/model" + "/src/main/", ".bo");
        createdCode.createdController("/api" + "/src/main/", "");
        createdCode.createdService("/service" + "/src/main/", "");
        createdCode.createdMapper("/mapper" + "/src/main/", "");
//        createdCode.createdEntity( "/src/main/", ".bo");
//        createdCode.createdController("/src/main/", "");
//        createdCode.createdService("/src/main/", "");
//        createdCode.createdMapper( "/src/main/", "");

    }

    /**
     * 生成mapper
     *
     * @param pkgPath 指定输出目录
     * @param path    设置entity包名
     */
    private void createdMapper(String pkgPath, String path) {
        String _path = this.addrPrefix + pkgPath + "java";
        String PkgXml = this.addrPrefix + pkgPath + "resources/mapper" + path;
        // 开始生成代码
        FastAutoGenerator.create(this.url, this.mysqlName, this.mysqlPwd)
                .globalConfig(builder -> {
                    // 全局配置
                    builder.author(author) // 设置作者
                            .disableOpenDir() // 禁止自动打开输出目录
                            .outputDir(_path); // 指定输出目录
                })
                .packageConfig(builder -> {
//                    // 设置包配置
                    builder.parent(packageName)
                            .mapper("mapper" + path) // 设置包名
                            .entity("entity.bo")
                            .pathInfo(new HashMap<OutputFile, String>() {{
                                put(OutputFile.xml, PkgXml); // 设置xml输出路径
                            }}); // 设置父包名
                })
                .strategyConfig(builder -> {
                    // 设置策略配置
                    builder
                            .addInclude(this.tableName) // 设置需要生成的表名
                            .addTablePrefix(this.tablePrefix) // 设置过滤表前缀
                            .serviceBuilder();

                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker模板引擎
                // 模板配置
                .templateConfig(
                        builder -> builder.disable().mapper("/templates/mapper.java")
                                .xml("/templates/mapper.xml") // mapper.xml.ftl
                )
                .execute(); // 执行生成操作
    }


    /**
     * 生成服务层
     *
     * @param pkgPath 指定输出目录
     * @param path    设置entity包名
     */
    private void createdService(String pkgPath, String path) {
        String _path = this.addrPrefix + pkgPath + "java";
        // 开始生成代码
        FastAutoGenerator.create(this.url, this.mysqlName, this.mysqlPwd)
                .globalConfig(builder -> {
                    // 全局配置
                    builder.author(author) // 设置作者
                            .disableOpenDir() // 禁止自动打开输出目录
                            .outputDir(_path); // 指定输出目录
                })
                .packageConfig(builder -> {
//                    // 设置包配置
                    builder.parent(packageName)
                            .service("service" + path)
                            .entity("entity.bo")
                    ; // 设置controller包名

                })
                .strategyConfig(builder -> {
                    // 设置策略配置
                    builder
                            .addInclude(this.tableName) // 设置需要生成的表名
                            .addTablePrefix(this.tablePrefix) // 设置过滤表前缀
                            .serviceBuilder();

                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker模板引擎
                // 模板配置
                .templateConfig(
                        builder -> builder.disable().service("/templates/service.java").serviceImpl("/templates" +
                                "/serviceImpl.java")
                )
                .execute(); // 执行生成操作
    }

    /**
     * 生成控制层
     *
     * @param pkgPath        指定输出目录
     * @param controllerPath 设置entity包名
     */
    private void createdController(String pkgPath, String controllerPath) {
        String path = this.addrPrefix + pkgPath + "java";
        // 开始生成代码
        FastAutoGenerator.create(this.url, this.mysqlName, this.mysqlPwd)
                .globalConfig(builder -> {
                    // 全局配置
                    builder.author(author) // 设置作者
                            .disableOpenDir() // 禁止自动打开输出目录
                            .outputDir(path); // 指定输出目录
                })
                .packageConfig(builder -> {
//                    // 设置包配置
                    builder.parent(packageName)
                            .controller("controller" + controllerPath); // 设置controller包名
                })
                .strategyConfig(builder -> {
                    // 设置策略配置
                    builder
                            .addInclude(this.tableName) // 设置需要生成的表名
                            .addTablePrefix(this.tablePrefix) // 设置过滤表前缀
                            .entityBuilder()
                            .enableLombok(); // 启用 Lombok 注解

                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker模板引擎
                // 模板配置
                .templateConfig(
                        builder -> builder.disable().controller("/templates/controller.java")
                )
                .execute(); // 执行生成操作
    }


    /**
     * 生成实体类
     *
     * @param pkgPath    指定输出目录
     * @param entityPath 设置entity包名
     */
    private void createdEntity(String pkgPath, String entityPath) {
        String path = this.addrPrefix + pkgPath + "java";
        // 开始生成代码
        FastAutoGenerator.create(this.url, this.mysqlName, this.mysqlPwd)
                .globalConfig(builder -> {
                    // 全局配置
                    builder.author(author) // 设置作者
                            .disableOpenDir() // 禁止自动打开输出目录
                            .outputDir(path); // 指定输出目录
                })
                .packageConfig(builder -> {
                    // 包配置
                    // 这里假设entityPath是相对于包名的路径，用于确定实体类应该放在哪个子包下
                    builder.parent(this.packageName)
                            // 设置模块名，即子包名，用于存放生成的实体类
//                            .moduleName("entity.bo")
                            .entity("entity" + entityPath);
                    ;

                })
                .strategyConfig(builder -> {
                    // 设置策略配置
                    builder
                            .addInclude(this.tableName) // 设置需要生成的表名
                            .addTablePrefix(this.tablePrefix) // 设置过滤表前缀
                            .entityBuilder()
                            .enableLombok(); // 启用 Lombok 注解

                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker模板引擎
                // 模板配置
                .templateConfig(
                        builder -> builder
                                .disable()
                                .entity("/templates/entity.java")
                )
                .execute(); // 执行生成操作
    }

}
